package com.huahai.controller;

import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.huahai.common.BaseResponse;
import com.huahai.common.DeleteRequest;
import com.huahai.exception.BusinessException;
import com.huahai.exception.ErrorCode;
import com.huahai.manager.auth.annotation.SaSpaceCheckPermission;
import com.huahai.manager.auth.constants.SpaceUserPermissionConstant;
import com.huahai.pojo.dto.spaceuser.SpaceUserAddDTO;
import com.huahai.pojo.dto.spaceuser.SpaceUserEditDTO;
import com.huahai.pojo.dto.spaceuser.SpaceUserQueryDTO;
import com.huahai.pojo.entity.SpaceUser;
import com.huahai.pojo.entity.User;
import com.huahai.pojo.vo.spaceuser.SpaceUserVO;
import com.huahai.service.SpaceService;
import com.huahai.service.SpaceUserService;
import com.huahai.service.UserService;
import com.huahai.util.ResultUtils;
import com.huahai.util.ThrowUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.List;

/**
 * 团队用户空间控制器
 *
 * @author huahai
 */
@RestController
@RequestMapping("spaceUser")
@Slf4j
public class SpaceUserController {

    @Resource
    private SpaceUserService spaceUserService;

    @Resource
    private UserService userService;

    @Resource
    private SpaceService spaceService;

    /**
     * 添加团队空间成员
     *
     * @param spaceUserAddDTO 添加空间用户请求
     * @return 添加的成员ID
     */
    @PostMapping("/add")
    @SaSpaceCheckPermission(value = SpaceUserPermissionConstant.SPACE_USER_MANAGE)
    public BaseResponse<Long> addSpaceUser(@RequestBody SpaceUserAddDTO spaceUserAddDTO) {
        // 1. 校验参数
        ThrowUtils.throwIf(spaceUserAddDTO == null, ErrorCode.PARAMS_ERROR);
        // 2. 调用服务
        Long userId = spaceUserService.addSpaceUser(spaceUserAddDTO);
        // 3. 返回结果
        return ResultUtils.success(userId);
    }

    /**
     * 删除团队空间成员
     *
     * @param deleteRequest 删除请求
     * @return 删除结果
     */
    @PostMapping("/delete")
    @SaSpaceCheckPermission(value = SpaceUserPermissionConstant.SPACE_USER_MANAGE)
    public BaseResponse<Boolean> deleteSpaceUser(@RequestBody DeleteRequest deleteRequest) {
        // 1. 校验参数
        if (deleteRequest == null || deleteRequest.getId() <= 0) {
            throw new BusinessException(ErrorCode.PARAMS_ERROR);
        }
        // 2. 判断是否存在该条信息
        SpaceUser spaceUser = spaceUserService.getById(deleteRequest.getId());
        ThrowUtils.throwIf(spaceUser == null, ErrorCode.NOT_FOUND_ERROR);
        // 3. 执行删除操作
        boolean removeResult = spaceUserService.removeById(spaceUser);
        ThrowUtils.throwIf(!removeResult, ErrorCode.OPERATION_ERROR, "空间成员信息删除失败");
        return ResultUtils.success(true);
    }

    /**
     * 查询某个成员在空间的信息
     *
     * @param spaceUserQueryDTO 查询参数
     * @return 要查询的团队空间成员信息
     */
    @PostMapping("/get")
    @SaSpaceCheckPermission(value = SpaceUserPermissionConstant.SPACE_USER_MANAGE)
    public BaseResponse<SpaceUser> getSpaceUser(@RequestBody SpaceUserQueryDTO spaceUserQueryDTO) {
        // 1. 校验参数
        ThrowUtils.throwIf(spaceUserQueryDTO == null, ErrorCode.PARAMS_ERROR);
        Long spaceId = spaceUserQueryDTO.getSpaceId();
        Long userId = spaceUserQueryDTO.getUserId();
        ThrowUtils.throwIf(ObjectUtil.hasEmpty(spaceId, userId), ErrorCode.PARAMS_ERROR);
        // 2. 构造查询条件,执行查询操作
        QueryWrapper<SpaceUser> queryWrapper = spaceUserService.getQueryWrapper(spaceUserQueryDTO);
        SpaceUser spaceUser = spaceUserService.getOne(queryWrapper);
        ThrowUtils.throwIf(spaceUser == null, ErrorCode.NOT_FOUND_ERROR);
        // 3. 返回结果
        return ResultUtils.success(spaceUser);
    }

    /**
     * 获取团队空间成员列表
     *
     * @param spaceUserQueryDTO 查询参数
     * @return 团队空间成员列表
     */
    @PostMapping("/list")
    @SaSpaceCheckPermission(value = SpaceUserPermissionConstant.SPACE_USER_MANAGE)
    public BaseResponse<List<SpaceUserVO>> listSpaceUser(@RequestBody SpaceUserQueryDTO spaceUserQueryDTO) {
        // 1. 校验参数
        ThrowUtils.throwIf(spaceUserQueryDTO == null, ErrorCode.PARAMS_ERROR);
        // 2. 构造查询条件,执行查询操作
        QueryWrapper<SpaceUser> queryWrapper = spaceUserService.getQueryWrapper(spaceUserQueryDTO);
        List<SpaceUser> spaceUserList = spaceUserService.list(queryWrapper);
        // 3. 封装并返回结果
        List<SpaceUserVO> spaceUserVOList = spaceUserService.getSpaceUserVOList(spaceUserList);
        return ResultUtils.success(spaceUserVOList);
    }

    /**
     * 编辑团队空间成员信息
     *
     * @param spaceUserEditDTO 编辑参数
     * @return 编辑结果
     */
    @PostMapping("/edit")
    @SaSpaceCheckPermission(value = SpaceUserPermissionConstant.SPACE_USER_MANAGE)
    public BaseResponse<Boolean> editSpaceUser(@RequestBody SpaceUserEditDTO spaceUserEditDTO) {
        // 1. 校验参数
        Long spaceUserId = spaceUserEditDTO.getId();
        ThrowUtils.throwIf(spaceUserEditDTO == null || spaceUserId <= 0, ErrorCode.PARAMS_ERROR);
        // 判断是否存在
        SpaceUser oldSpaceUser = spaceUserService.getById(spaceUserId);
        ThrowUtils.throwIf(oldSpaceUser == null, ErrorCode.NOT_FOUND_ERROR);
        // 2. 转换实体类
        SpaceUser spaceUser = new SpaceUser();
        BeanUtils.copyProperties(spaceUserEditDTO, spaceUser);
        // 3. 校验编辑参数
        spaceUserService.validSpaceUser(spaceUser, false);
        // 如果修改后的角色和未修改的角色一致，则不修改角色
        if(oldSpaceUser.getSpaceRole().equals(spaceUser.getSpaceRole())){
            return ResultUtils.success(true);
        }
        // 4. 执行编辑操作
        boolean updateResult = spaceUserService.updateById(spaceUser);
        ThrowUtils.throwIf(!updateResult, ErrorCode.OPERATION_ERROR, "空间成员信息编辑失败");
        // 5. 返回编辑结果
        return ResultUtils.success(true);
    }


    /**
     * 查询我加入的团队空间列表
     * @param request 请求
     * @return 团队空间列表
     */
    @PostMapping("/list/my")
    public BaseResponse<List<SpaceUserVO>> listMyTeamSpace(HttpServletRequest request) {
        // 1. 获取当前用户
        User loginUser = userService.getLoginUser(request);
        // 2. 构造查询条件
        SpaceUserQueryDTO spaceUserQueryDTO = new SpaceUserQueryDTO();
        spaceUserQueryDTO.setUserId(loginUser.getId());
        QueryWrapper<SpaceUser> queryWrapper = spaceUserService.getQueryWrapper(spaceUserQueryDTO);
        // 3. 执行查询
        List<SpaceUser> spaceUserList = spaceUserService.list(queryWrapper);
        // 4. 返回封装后的列表
        return ResultUtils.success(spaceUserService.getSpaceUserVOList(spaceUserList));
    }
}
